﻿/* 
 * File:   dat_quene.h
 * Author: aple
 */

#ifndef __AC_SIGNAL_H_H_
#define	__AC_SIGNAL_H_H_

#include "stdint.h"

#ifdef	__cplusplus
extern "C" {
#endif


	/*----输出故障检测-回路电流状态----*/
	typedef struct
	{
		// 输入-公有
		uint16_t ad_val;			//Y ad值 // 如果是开关信号，adval=信号状态
		uint16_t ad_set;			//Y 阀值 // 如果是开关信号，将adset设为0
		uint16_t out_period;		//Y pid周期,单位为调用周期-
		int8_t st_cnt_max;			//Y 应大于等于2，当错误累计数达到边界时，short/open out is marked
		
		// 输入-仅async有效
		uint8_t elec_period;		//Y 电周期，对于50Hz，应设为20ms对应的ticks
		uint16_t check_delay;		//Y 一般设为1,输出状态切换后，延时一定电周期数后开始检测-
		uint8_t elec_effective;		//Y 一个电周期内，有效信号数最小值----
		
		//电周期内部处理
		uint8_t elec_tick_cnt;		//X
		uint8_t elec_found_cnt;		//X
		uint8_t elec_found_keep;	//X
		uint8_t out_st_old;			//X
		uint16_t out_st_keep_cnt;	//X输出状态保持计数器-计时单位为电周期-
		uint16_t out_cnt;			//X 单位为调用周期-
		
		//-输出-
		int8_t short_elec_cnt;		//X 一个控制周期内的 short 数-
		int8_t open_elec_cnt;			//X 一个控制周期内的 open  数-
		int8_t short_period_cnt;	//X 输出结果，记录short错误周期数（控制周期）-
		int8_t open_period_cnt;		//X 输出结果，记录open错误周期数（控制周期）-
		int8_t err_short_out;		//X 状态输出- 外部清除
		int8_t err_open_out;		//X 状态输出- 外部清除
	} out_current_check_type;
	
	/*- 同步检测，定时调用-*/
	void current_async_check_handle(out_current_check_type * obj, uint8_t out_st);
	
	/*- 交流电流同步检测，每个输出相位点调用，period指示pid周期，单位为输出点数-*/
	/*- out 为下一个点周期状态, 对于电周期平均分布的应用，应对正负边分别统计*/
	/*- 对于半波输入且输出电周期平均分布的应用，应对正负边分别统计，短路为或结果，开路为为与结果*/
	void current_osync_check_handle(out_current_check_type * obj, uint8_t out_st);


	/*--------------------------------------------------------------------------*
	* 半波检测相位同步
	* 如果信号不对称，输入电平较短的状态应为1
	* 内部滤波导致至少4个调用周期的信号延迟
	* 对于50/60Hz信号，建议检测周期为0.5ms
	* out指示输出相位点
	*---------------------------------------------------------------------------*/
	typedef struct
	{
		// 设置
		int8_t time_out_set;		// Y 相位计数超时-
		int8_t phase; 				// Y 输出相位-
		
		// 运行时
		int8_t signal_flt;  		// X 滤波计数器
		uint8_t signal_st;  		// X 滤波后信号状态
		uint8_t signal_old; 		// X 信号记录-
		int8_t wide; 				// X 信号宽度，仅用于观测-
		int8_t period;				// X 
		int8_t period1, period2;	// X 
		int8_t cnt; 				// X 相位计数--
		uint8_t err; 				// X 错误标记-
		uint8_t out_at_sig;			// X
		uint8_t out_at_sig_none;	// X
		uint8_t out;				// X
		uint16_t period_keep_cnt;	// X
	} half_ac_sync_out_point_type;

	uint8_t half_ac_sync_out_point_handle(half_ac_sync_out_point_type * obj, uint8_t signal);

#ifdef	__cplusplus
}
#endif

#endif	/* __AC_SIGNAL_H_H_ */

